//
//  AP.swift
//  APSwift
//
//  Created by jianbo.pei on 2022/5/18.
//

/**
总结，在`Swift`中给类型添加前缀调用的方式分四个步骤：
1. 声明一个前缀类型，这个前缀类型通常是一个`struct`。
2. 声明前缀属性的协议，在协议中实现实例的前缀属性和静态类型的前缀属性。
3. 需要用到前缀调用自定义扩展内容的类型遵守前缀属性的协议。
4. 通过前缀类型的`extension`来实现类型的扩展内容。
*/

import Foundation

/// 1.声明一个前缀类型
public struct APBase<Base> {
    let base: Base
    init(_ base: Base) {
        self.base = base
    }
}

/// compatible: 兼容的；可共存的；可和睦相处的；与……一致的
/// 英  [kəmˈpætəbl]
/// 2.1 声明前缀属性的协议
public protocol APCompatible { }

/// 2.2 在协议中实现实例的前缀属性和静态类型的前缀属性
public extension APCompatible {
    var ap: APBase<Self> {
        get { APBase(self) }
        set {}
    }
    
    static var ap: APBase<Self>.Type {
        get { APBase<Self>.self }
        set {}
    }
}

/**
 *【3和4建议写在对应的extension等中】
 *
 /// 3. 需要用到前缀调用自定义扩展内容的类型遵守前缀属性的协议。
 extension String: APCompatible {}

 /// 4. 通过前缀类型的`extension`来实现类型的扩展内容。
 extension APBase where Base == String {
     func separated(by str: String) -> [String] {
         return self.base.components(separatedBy: str)
     }
 }

 /// 使用示例：
 private func test() {
     let str = "你好，世界！你好，中国！"
     print("str拆分后：\(str.ap.separated(by: "，"))")
     /// str拆分后：["你好", "世界！你好", "中国！"]
 }
 *
 */
